<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
</body>
</html>

<script>

// 形参的 假写：var obj;
const update = (obj) => {
  // obj = {
  //   ...obj
  // };  //  浅拷贝

  // 深拷贝
  obj =  JSON.parse(JSON.stringify(obj));

  // 实参给形参赋值的假写：obj = o;
  obj.name = 'update';
  obj.child.name = 'update - child name'
  // console.log(obj);
  return obj;
}


// const o = {
//   name: '小明',
//   child: {
//     name: '小明的孩子 - xx'
//   }
// }


// update(o);


// console.log(o);


// -------  深拷贝  和  浅拷贝
  // 面试问题：
    // 1. 深拷贝和浅拷贝有什么用？ - 见 update 函数相关
    // 2. 如何进行深拷贝和浅拷贝：
      // 1）逻辑处理，进行 浅拷贝  和  深拷贝（通过循环加递归）

        /* 浅拷贝 进行浅拷贝
          function clone(object) {
            const result = {};
            for (const key in object) {
              const value = object[key];
              result[key] = value;
            }

            return result;
          }
        */

        /* 逻辑 进行 深拷贝

          function clone(object) {
            const result = {};
            for (const key in object) {
              const value = object[key];
              if (typeof value === 'object') {
                result[key] = clone(value);
                return result;
              }
              result[key] = value;
            }

            return result;
          }

          const o = {
            name: '小明',
            child: {
              name: '小明的孩子 - xx'
            }
          }
          const cloneO = clone(o);

          cloneO.child.name = 'update -xxx';
          console.log(cloneO, o);

        */

      // 2）lodash

      // 3) 浅拷贝  -  ...运算符  -  见上面 update 函数

      // 4）深拷贝 -  JSON.parse(JSON.stringify(obj))  -  见上面 update 函数

// 面向对象


function clone(object) {
  const result = {};
  for (const key in object) {
    const value = object[key];

    // 若 value 是 引用类型，110行 会执行；即 value 进一步被递归拷贝
    result[key] = value;
    if (typeof value === 'object') {
      result[key] = clone(value);
      return result; // 这个地方 不能加 return  
    }
  }

  return result;
}

const o = {
  name: '小明',
  child: {
    name: '小明的孩子 - xx',
  },
  sex: 'male'
}
const cloneO = clone(o);

cloneO.child.sex = 'female';

console.log(cloneO, o);
</script>